package 网络编程.UDPECHO;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 石方旭
 * Date: 2022-10-01
 * Time: 15:50
 */
public class UDPSever {
    //UDP回显服务器->也就是自己给自己发送数据
    //使用UDP是利用数据报来传输数据的
    private DatagramSocket socket = null;
    //服务器这边需要指定端口号-->这样客户端才会知道发给哪个服务器
    public UDPSever(int port) throws SocketException {
       socket = new DatagramSocket(port);
    }

    //计算请求的过程-->回显服务器,给啥请求就返回啥响应
    public String process(String response){
        return response;
    }

    //启动UDP回显服务器
    public void start() throws IOException {
        System.out.println("UDP回显服务器开始启动...");
        while(true){//-->长连接->多次服务器-客户端交互
            //服务器这边要先接收客户端发来的请求
            //1.先要构造请求数据报-->这个数据报的数据是要写在缓冲区里面的->利用字节数组+长度
            DatagramPacket requestPacket = new DatagramPacket(new byte[4096],4096);
            //2.UDP数据报接收请求,将接受的数据放到请求数据报中
            socket.receive(requestPacket);
            //3.UDP服务器需要对请求做出解析-->也就是将数据包中的数据转化成字符串
            String request = new String(requestPacket.getData(),
                    0,requestPacket.getLength());
            //4.需要根据解析出来的请求,计算出响应数据
            String response = process(request);
            //5.将计算出来的响应返回给客户端
            //还是先要构造数据报
            DatagramPacket responsePacket = new DatagramPacket(response.getBytes()
            ,response.getBytes().length,requestPacket.getSocketAddress());
            //6.将响应数据报返回给客户端
            socket.send(responsePacket);
            //显示请求的地址和端口号及对应的请求和响应
            System.out.printf("[%s : %d] ; req = %s ; res = %s",requestPacket.getAddress().toString()
            ,requestPacket.getPort(),request,response);
            System.out.println();
        }
    }

    public static void main(String[] args) throws IOException {
        UDPSever udpSever =  new UDPSever(8000);
        udpSever.start();
    }

}
